﻿using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

using System.Data.SQLite;
using System.Data.SQLite.Linq;
using Newtonsoft.Json.Linq;
using System.Diagnostics;
using System.Windows;
using System.Collections.ObjectModel;
using AutomationCommand;

namespace TaskManagement
{

    /*
     * 管理器:必须能够执行:一个命令,一脚本,一个任务
     * 一个命令是最基本的单元
     * 一个脚本是一组命令
     * 一个任务是一组命令
     * 后期扩展:可以混合创建新的命令:利用命令,脚本,任务等混合
     */




    // 任务状态枚举
    public enum TaskStatus
    {
        Pending,    // 任务等待执行
        Running,    // 任务正在执行
        Completed,  // 任务已完成
        Failed      // 任务执行失败
    }





    /// <summary>
    /// 任务管理器基类，用于管理所有任务的执行：添加任务、启动任务执行、停止任务执行，唯一索引：TaskId
    /// </summary>
    public class TaskManager
    {


        public TaskManagerControl managerControl = new TaskManagerControl();

        public TaskManager()
        {
            managerControl.Name = "任务管理器";
            Guid = Guid.NewGuid();
            ExcuteJumpId = -1;//默认从-1开始执行
            managerControl.taskButton.Click += TaskButton_Click;


            ScriptCommandList.CollectionChanged += ScriptCommandList_CollectionChanged;


            //unitCommand相关的初始化
            //各种要用到的：浏览器，手机，其它资源
            
        }

        private void ScriptCommandList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            Console.WriteLine("命令列表被修改......");
        }

        private void TaskButton_Click(object sender, RoutedEventArgs e)
        {


            //执行任务优先执行子任务
            if (Children.Count == 0)
            {
            }
        }

        /// <summary>
        /// 任务ID:由Guid生成
        /// </summary>
        public Guid Guid { get; set; }
        /// <summary>
        /// 任务名称
        /// </summary>
        public string Name { get; set; }

        #region 脚本命令集管理

        /// <summary>
        /// 脚本命令集:脚本命令代码,输入后,要修改到ScriptCommandAutomation
        /// </summary>
        public ObservableCollection<JObject> ScriptCommandList = new ObservableCollection<JObject>();

        /// <summary>
        /// 找到并且执行命令
        /// </summary>
        /// <param name="keyValuePairs"></param>
        public void FindCommandExcute(JObject keyValuePairs)
        {
            int id = ScriptCommandList.IndexOf(keyValuePairs);
            Console.WriteLine(id);
            if (id >= 0)
            {
                CommandExcute(keyValuePairs);
            }
        }

        /// <summary>
        /// 命令执行指挥器
        /// </summary>
        public UnitCommand unitCommand = new UnitCommand();

        /// <summary>
        /// 脚本命令集:观察者
        /// </summary>
        public ObservableCollection<AutomationCommand.BasiCommand> ScriptCommandAutomation = new ObservableCollection<AutomationCommand.BasiCommand>();

        #endregion


        /// <summary>
        /// 当前执行的JumpId,写在脚本中了
        /// </summary>
        public int ExcuteJumpId { get; set; }
        /// <summary>
        /// 任务列表:子任务列表
        /// </summary>
        public List<TaskManager> Children = new List<TaskManager>();

        /// <summary>
        /// 进程列表:用于存储任务执行过程中产生的进程
        /// </summary>
        public List<Process> Processes = new List<Process>();

        public Dictionary<int, Process> ProcessesDictionary = new Dictionary<int, Process>();

        /// <summary>
        /// 任务状态:执行器根据任务状态执行任务
        /// </summary>
        public TaskStatus Status { get; set; }   // 任务状态

        /// <summary>
        /// 添加任务:向本层分支添加任务
        /// </summary>
        /// <param name="taskManager"></param>
        public void Add(TaskManager taskManager)
        {
            Children.Add(taskManager);
        }

        /// <summary>
        /// 删除任务:从本层分支删除任务
        /// </summary>
        /// <param name="taskManager"></param>
        public void Del(TaskManager taskManager)
        {
            Children.Remove(taskManager);
        }

        /// <summary>
        /// 启动任务列表
        /// </summary>
        public void Start()
        {

            for (int i = 0; i < Children.Count; i++)
            {
                Children[i].CommandsExcute();
            }

            //jToken执行
        }

        /// <summary>
        /// 停止任务列表
        /// </summary>
        public void Stop()
        {
            //jToken执行
        }



        /// <summary>
        /// 单个命令直接执行
        /// </summary>
        /// <param name="command"></param>
        public void CommandExcute(JObject command)
        {

            //如果不存在，就不需要执行
            if (!command.ContainsKey("fun_type"))
            {
                return;
            }
            string fun_type = command["fun_type"].ToString();
            unitCommand.commandDictionary[fun_type].Execute(command, new OpenQA.Selenium.Chrome.ChromeDriver());

        }


        /// <summary>
        /// 本层脚本列表执行
        /// </summary>
        public void CommandsExcute()
        {

            //jToken执行
        }

        /// <summary>
        /// 本层脚本列表停止
        /// </summary>
        public void CommandsStop()
        {

        }


    }




}
